package com.bskms.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.bskms.bean.Message;
import com.bskms.mapper.MessageMapper;
import com.bskms.service.ChatService;
import org.apache.hc.client5.http.classic.methods.HttpPost;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.core5.http.ContentType;
import org.apache.hc.core5.http.io.entity.StringEntity;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;

/**
 * 聊天服务实现类
 * 
 * 功能说明：
 * 1. 智能对话：集成通义千问AI，提供智能问答功能
 * 2. 消息管理：处理用户消息的发送、接收和存储
 * 3. 历史记录：保存和查询对话历史，支持上下文理解
 * 4. API集成：调用外部AI服务，获取智能回复
 * 5. 错误处理：提供完善的异常处理和降级机制
 * 
 * 设计思路：
 * - 实现ChatService接口，提供完整的聊天业务逻辑
 * - 集成通义千问API，实现智能对话功能
 * - 使用消息持久化，支持对话历史查询
 * - 采用上下文构建，提高对话连贯性
 * - 提供异常处理，确保系统稳定性
 * 
 * 技术特点：
 * - AI模型集成，提供智能回复
 * - 消息持久化，支持历史查询
 * - 上下文构建，增强对话连贯性
 * - 异常处理，提供降级机制
 * - 异步处理，提高响应速度
 * 
 * @author 系统开发者
 * @version 1.0
 * @since 2024
 */
@Service
public class ChatServiceImpl implements ChatService {

    // 消息数据访问层，提供消息的数据库操作接口
    private final MessageMapper messageMapper;

    // 通义千问 API 配置（需替换为实际的 API 地址和密钥）
    private static final String QWEN_API_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions"; // 兼容 OpenAI 格式的接口
    private static final String API_KEY = "sk-be924bedc3a6457f9f2e376d684f848f"; // 替换为你的 API 密钥（从阿里云获取）

    /**
     * 构造函数，通过依赖注入初始化MessageMapper
     * 
     * @param messageMapper 消息数据访问层实现
     */
    public ChatServiceImpl(MessageMapper messageMapper) {
        this.messageMapper = messageMapper;
    }

    @Override
    public String sendMessage(String userMessage) {
        // 1. 保存用户消息到数据库
        Message userMsg = new Message();
        userMsg.setContent(userMessage);
        userMsg.setSender("user");
        userMsg.setSendTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        messageMapper.save(userMsg);

        // 2. 调用通义千问 API 获取回复
        String botResponse;
        try {
            // 构建包含历史消息的上下文
            List<JSONObject> messages = buildChatContext(userMessage);
            // 调用 API
            botResponse = callQwenApi(messages);
        } catch (Exception e) {
            // 异常时返回默认回复
            botResponse = "抱歉，暂时无法生成回复，请稍后再试～";
            e.printStackTrace();
        }

        // 3. 保存机器人回复到数据库
        Message botMsg = new Message();
        botMsg.setContent(botResponse);
        botMsg.setSender("robot");
        botMsg.setSendTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        messageMapper.save(botMsg);

        return botResponse;
    }

    @Override
    public List<Message> getHistoryMessages() {
        return messageMapper.findLatestMessages();
    }

    /**
     * 构建对话上下文（包含历史消息，增强连贯性）
     */
    private List<JSONObject> buildChatContext(String userMessage) {
        List<Message> history = messageMapper.findLatestMessages(); // 获取历史消息
        List<JSONObject> messages = new ArrayList<>();

        // 添加历史消息到上下文
        for (Message msg : history) {
            JSONObject json = new JSONObject();
            json.put("role", msg.getSender().equals("user") ? "user" : "assistant"); // Qwen 要求角色为 user/assistant
            json.put("content", msg.getContent());
            messages.add(json);
        }

        // 添加当前用户消息
        JSONObject currentMsg = new JSONObject();
        currentMsg.put("role", "user");
        currentMsg.put("content", userMessage);
        messages.add(currentMsg);

        return messages;
    }

    /**
     * 调用通义千问 API
     */
    private String callQwenApi(List<JSONObject> messages) throws IOException {
        // 创建 HTTP 客户端
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            // 构建请求体
            JSONObject requestBody = new JSONObject();
            requestBody.put("model", "qwen-plus"); // 模型名称（如 qwen-plus、qwen-max 等）
            requestBody.put("messages", messages); // 对话上下文
            requestBody.put("temperature", 0.7); // 随机性（0-1，值越高回复越多样）

            // 创建 POST 请求
            HttpPost httpPost = new HttpPost(QWEN_API_URL);
            httpPost.setHeader("Authorization", "Bearer " + API_KEY); // 认证头
            httpPost.setHeader("Content-Type", "application/json");
            httpPost.setEntity(new StringEntity(requestBody.toString(), ContentType.APPLICATION_JSON));

            // 发送请求并获取响应
            // 执行HTTP POST请求，并通过Lambda表达式处理响应结果
            // httpClient.execute()方法接收两个参数：HTTP请求对象和响应处理器
            return httpClient.execute(httpPost, response -> {
                // 解析响应内容为JSONObject
                // response.getEntity().getContent()获取响应的输入流
                // JSON.parseObject()将输入流解析为JSON对象
                JSONObject responseJson = JSON.parseObject(response.getEntity().getContent(), JSONObject.class);

                // 提取回复内容，这里兼容OpenAI格式的响应结构
                // 1. 从JSON对象中获取"choices"数组（OpenAI响应中包含多个可能的回复选项）
                // 2. 获取数组中的第一个元素（通常取第一个回复选项）
                // 3. 从该元素中获取"message"对象（包含角色和内容信息）
                // 4. 最后提取"content"字段的值，即实际的回复内容
                return responseJson.getJSONArray("choices")
                        .getJSONObject(0)
                        .getJSONObject("message")
                        .getString("content");
            });
        }
    }
}